package com.ylr.config.framework.controller.web;

import java.util.List;

import com.ylr.config.common.vo.enum_.EnumFormVo;
import com.ylr.config.common.vo.enum_.EnumVo;
import com.ylr.config.framework.service.EnumService;
import com.ylr.base.common.dto.NameValue;
import com.ylr.base.common.dto.PageDto;
import com.ylr.base.common.jsr303.group.Save;
import com.ylr.base.common.jsr303.group.Search;
import com.ylr.base.common.jsr303.group.Update;
import com.ylr.base.common.tool.Result;
import com.ylr.config.common.dto.enum_.EnumDto;
import com.ylr.config.common.enums.Enum;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Size;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-05-02 18:59:16
 * className: EnumsController
 * version: 1.0
 * description:
 */
@Validated
@RestController
@RequestMapping("/web/enum")
@AllArgsConstructor
public class EnumWebController {

    private static final Logger log = LoggerFactory.getLogger(EnumWebController.class);

    private EnumService enumsService;

    /**
     * 保存新枚举配置接口
     * @param enumVo 参数对象
     */
    @PostMapping("/save")
    public Result<Object> saveEnum(@Validated(Save.class) @RequestBody EnumVo enumVo) {
        log.info("web => 开始保存新枚举配置操作。{}", enumVo);
        if (Enum.NULL.equals(Enum.getEnum(enumVo.getType()))) {
            log.info("枚举类型不存在。type={}", enumVo.getType());
            return Result.fail("枚举类型不存在，请确认");
        }

        enumsService.saveEnum(enumVo);

        log.info("web => 保存新枚举配置操作结束");
        return Result.success();
    }

    /**
     * 批量保存新枚举配置接口
     * @param enumVoList 参数对象列表
     */
    @PostMapping("/batch/save")
    public Result<Object> batchSaveEnum(@Validated(Save.class) @Size(min = 1, message = "枚举配置列表不能为空") @RequestBody List<EnumVo> enumVoList) {
        log.info("web => 开始批量保存新枚举配置操作。enumVoList={}", enumVoList);
        for (int i = 0; i < enumVoList.size(); i++) {
            EnumVo enumVo = enumVoList.get(i);
            if (Enum.NULL.equals(Enum.getEnum(enumVo.getType()))) {
                log.info("第{}条数据,枚举类型不存在。type={}", i + 1, enumVo.getType());
                return Result.fail("第" + (i + 1) + "条数据,枚举类型不存在");
            }
        }

        enumsService.batchSaveEnum(enumVoList);

        log.info("web => 批量保存新枚举配置操作结束");
        return Result.success();
    }

    /**
     * 分页查询枚举配置列表接口
     * @param enumFormVo 参数对象
     * @return 枚举配置分页数据
     */
    @GetMapping("/page/list")
    public Result<PageDto<EnumDto>> pageEnumList(@Validated(Search.class) @RequestBody EnumFormVo enumFormVo) {
        log.info("web => 开始分页查询枚举配置列表操作。{}", enumFormVo);

        PageDto<EnumDto> pageDto = enumsService.pageEnumList(enumFormVo);

        log.info("web => 分页查询枚举配置列表操作结束");
        return Result.success(pageDto);
    }

    /**
     * 获取枚举配置列表接口
     * 根据枚举类型，获取关联的所有枚举配置
     * @param type 枚举类型
     * @return 枚举配置列表
     */
    @GetMapping("/enums")
    public Result<List<NameValue<String>>> getEnumList(@RequestParam("type") Integer type) {
        log.info("web => 开始获取枚举配置列表操作。type={}", type);
        if (Enum.NULL.equals(Enum.getEnum(type))) {
            return Result.fail("枚举类型不存在，请确认");
        }

        List<NameValue<String>> list = enumsService.getEnumList(type);

        log.info("web => 获取枚举配置列表操作结束");
        return Result.success(list);
    }

    /**
     * 获取枚举配置接口
     * @param id 主键
     * @return 枚举配置
     */
    @RequestMapping("/get")
    public Result<EnumDto> getEnum(@RequestParam("id") Long id) {
        log.info("web => 开始获取枚举配置操作。id={}", id);

        EnumDto enumDto = enumsService.getEnum(id);

        log.info("web => 获取枚举配置操作结束");
        return Result.success(enumDto);
    }

    /**
     * 修改新枚举配置接口
     * @param enumVo 参数对象
     */
    @RequestMapping("/update")
    public Result<Object> updateEnum(@Validated(Update.class) @RequestBody EnumVo enumVo) {
        log.info("web => 开始修改新枚举配置操作。{}", enumVo);
        if (Enum.NULL.equals(Enum.getEnum(enumVo.getType()))) {
            return Result.fail("枚举类型不存在，请确认");
        }

        enumsService.updateEnum(enumVo);

        log.info("web => 修改新枚举配置操作结束");
        return Result.success();
    }

    /**
     * 删除枚举配置接口
     * @param idList 主键列表
     */
    @RequestMapping("/delete")
    public Result<Object> deleteEnum(@Size(min = 1, message = "主键列表不能为空") @RequestBody List<Long> idList) {
        log.info("web => 开始删除枚举配置操作。idList={}", idList);

        enumsService.deleteEnum(idList);

        log.info("web => 开始删除枚举配置操作");
        return Result.success();
    }

}
